#include "Capply.hpp"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <iostream>

client::client(string d, int p, int n) : destination(d), port(p), num(n) {}

void client::error(const char* msg) {
    perror(msg);
    exit(0);
}

bool client::apply() {
    struct hostent *server; // 主机服务器
    struct sockaddr_in serv_addr;

    // 建立套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0); // 创建套接字对象
    if (sockfd < 0) { // 判断套接字对象是否创建成功
        error("ERROR opening socket");
        return false;
    }

    // 找到主机服务器
    server = gethostbyname(destination.c_str()); // 获取服务端的IP地址
    if (server == NULL) { // 判断服务器是否找到
        fprintf(stderr, "ERROR, no such host\n");
        return false;
    }

    // 连接服务器
    bzero((char *) &serv_addr, sizeof(serv_addr)); // 初始化服务器地址参数为0
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); // 传达服务器地址信息
    serv_addr.sin_port = htons(port); // 设置服务器端口号
    if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { // 判断是否连接成功
        error("ERROR connecting");
        return false;
    }
    return true;
}

void client::sendimg() {
    int imgSize = img.total() * img.elemSize();
    int n = send(sockfd, img.data, imgSize, 0);
    if (n < 0) {
        error("ERROR writing to socket");
    }
}

void client::closefd() {
    close(sockfd);
}

void client::setimg(Mat image) {
    img = image;
}
